Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Warren Abstract Machine</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Warren_Abstract_Machine"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Warren_Abstract_Machine rootpage-Warren_Abstract_Machine skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Warren Abstract Machine</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<p>In 1983, <a href="David_H._D._Warren" title="David H. D. Warren">David H. D. Warren</a> designed an <a href="Abstract_machine" title="Abstract machine">abstract machine</a> for the execution of <a href="Prolog" title="Prolog">Prolog</a> consisting of a <a href="Computer_storage" class="mw-redirect" title="Computer storage">memory</a> architecture and an <a href="Instruction_set" class="mw-redirect" title="Instruction set">instruction set</a>.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> This design became known as the <b>Warren Abstract Machine</b> (<b>WAM</b>) and has become the <i>de facto</i> standard target for Prolog <a href="Compiler" title="Compiler">compilers</a>.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Purpose">Purpose</h2></div>
<p>The purpose of compiling Prolog code to the more low-level WAM code is to make subsequent interpretation of the Prolog program more efficient. Prolog code is reasonably easy to translate to WAM instructions, which can be more efficiently interpreted. Also, subsequent code improvements and compilations to native code are often easier to perform on the more low-level representation.
</p><p>In order to write efficient Prolog programs, a basic understanding of how the WAM works can be advantageous. Some of the most important WAM concepts are first argument indexing and its relation to choice-points, <a href="Tail_call_optimization" class="mw-redirect" title="Tail call optimization">tail call optimization</a>, and memory reclamation on failure.
</p>
<div class="mw-heading mw-heading2"><h2 id="Memory_areas">Memory areas</h2></div>
<p>The WAM has the following memory areas:
</p>
<ul><li>The <i>global stack</i> or <i>heap</i>, used to store compound terms</li>
<li>The <i>local stack</i> for environment frames and choice-points</li>
<li>The <i>trail</i> to record which variables bindings ought to be undone on backtracking</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Example">Example</h2></div>
<p>Here is a piece of Prolog code:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre> <span class="nf">girl</span><span class="p">(</span><span class="s s-Atom">sally</span><span class="p">).</span>
<span class="nf">girl</span><span class="p">(</span><span class="s s-Atom">jane</span><span class="p">).</span>
<span class="nf">boy</span><span class="p">(</span><span class="nv">B</span><span class="p">)</span> <span class="p">:-</span> <span class="s s-Atom">\+</span> <span class="nf">girl</span><span class="p">(</span><span class="nv">B</span><span class="p">).</span>
</pre></div>
<p>A WAM-based Prolog compiler will compile this into WAM instructions similar to the following:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre> <span class="nf">predicate</span><span class="p">(</span><span class="s s-Atom">girl</span><span class="o">/</span><span class="mi">1</span><span class="p">)</span><span class="s s-Atom">:</span>
<span class="nf">switch_on_term</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="s s-Atom">fail</span><span class="p">,</span><span class="s s-Atom">fail</span><span class="p">,</span><span class="s s-Atom">fail</span><span class="p">),</span>
<span class="nf">label</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="s s-Atom">:</span> <span class="nf">switch_on_atom</span><span class="p">([(</span><span class="s s-Atom">sally</span><span class="p">,</span><span class="mi">3</span><span class="p">),(</span><span class="s s-Atom">jane</span><span class="p">,</span><span class="mi">5</span><span class="p">)])</span>
<span class="nf">label</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="s s-Atom">:</span> <span class="nf">try_me_else</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="nf">label</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="s s-Atom">:</span> <span class="nf">get_atom</span><span class="p">(</span><span class="s s-Atom">sally</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="s s-Atom">proceed</span>
<span class="nf">label</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="s s-Atom">:</span> <span class="s s-Atom">trust_me_else_fail</span>
<span class="nf">label</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="s s-Atom">:</span> <span class="nf">get_atom</span><span class="p">(</span><span class="s s-Atom">jane</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="s s-Atom">proceed</span>
<span class="nf">predicate</span><span class="p">(</span><span class="s s-Atom">boy</span><span class="o">/</span><span class="mi">1</span><span class="p">)</span><span class="s s-Atom">:</span>
<span class="nf">get_variable</span><span class="p">(</span><span class="nf">x</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span><span class="mi">0</span><span class="p">)</span>
<span class="nf">put_structure</span><span class="p">(</span><span class="s s-Atom">girl</span><span class="o">/</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="nf">unify_local_value</span><span class="p">(</span><span class="nf">x</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="nf">execute</span><span class="p">((</span><span class="s s-Atom">\+</span><span class="p">)</span><span class="o">/</span><span class="mi">1</span><span class="p">)])</span>
</pre></div>
<p>An important characteristic of this code is its ability to cope with the various modes in which the predicates can be evoked: any argument might be a variable, a <a href="Ground_term" class="mw-redirect" title="Ground term">ground term</a>, or a partly instantiated term. The "switch" instructions handle the different cases.
</p>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFDavid_H._D._Warren1983" class="citation book cs1">David H. D. Warren (October 1983). <a rel="nofollow" class="external text" href="https://www.sri.com/wp-content/uploads/2021/12/641.pdf"><i>An abstract Prolog instruction set</i></a> <span class="cs1-format">(PDF)</span>. Menlo Park, CA, USA: <a href="Artificial_Intelligence_Center" title="Artificial Intelligence Center">Artificial Intelligence Center</a> at <a href="SRI_International" title="SRI International">SRI International</a>. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20220619231625/https://www.sri.com/wp-content/uploads/2021/12/641.pdf">Archived</a> <span class="cs1-format">(PDF)</span> from the original on 2022-06-19.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite id="CITEREFHassan_Aït-Kaci1999" class="citation book cs1 cs1-prop-unfit">Hassan Aït-Kaci (February 18, 1999). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20030213072337/http://www.vanx.org/archive/wam/wambook.pdf"><i>Warren's Abstract Machine: A Tutorial Reconstruction</i></a> <span class="cs1-format">(PDF)</span>. Archived from the original on 2003-02-13.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite id="CITEREFHassan_Aït-Kaci" class="citation web cs1">Hassan Aït-Kaci. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20220119110941/http://wambook.sourceforge.net/">"Warren's Abstract Machine: A Tutorial Reconstruction; the book, errata and slides"</a>. Archived from <a rel="nofollow" class="external text" href="http://wambook.sourceforge.net/">the original</a> on 19 January 2022<span class="reference-accessdate">. Retrieved <span class="nowrap">7 March</span> 2011</span>.</cite></span>
</li>
</ol></div></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-06-15" href="https://en.wikipedia.org/wiki/?title=Warren_Abstract_Machine&amp;oldid=1295764498">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>